\label{sect:desarrollo}
\subsection{Resoluci'on del problema}

Para la resoluci'on del problema planteado se desarrollaron diversos programas 
que cuando se los ejecuta de manera secuencial y en un orden preestablecido, 
resuelven el problema. Cada uno de estos programas genera el input del 
siguiente.

Se explicar'a cada uno de estos a continuaci'on, en el 
orden en el que deben ser ejecutados:

\begin{enumerate}

\item
\textbf{image\_manager}: la principal funci'on de este programa es construir, a 
partir de una im'agen, la matriz que la representa en modo texto para abstraer
el formato de imagen. Este programa tambi'en se usa al final para tomar la
matriz resultado y devolverla a modo imagen. Este programa est'a 
compuesto por los archivos: \texttt{graf/image\_manager.h}, 
\texttt{graf/image\_manager.cpp}, \texttt{graf/main.cpp}, \texttt{graf/matrix.h} 
y \texttt{graf/matrix.cpp}.

\item 
\textbf{gen\_rayos}: este programa a partir de un archivo que tiene la matriz, 
la cantidad de rayos y una semilla, genera los rayos a utilizar al azar, pero
siempre tirando rayos que tienen sus dos extremos en puntos sobre bordes 
distintos de la matriz. Dichos puntos no tienen necesariamente que tener
coordenadas enteras.
Este programa est'a compuesto por \texttt{/gen\_rayos/gen\_rayos.cpp}.

\item 
\textbf{rayitos}: este programa a partir de un archivo que tiene la matriz con 
el dibujo y la lista de rayos, genera la medida tomogr'afica diciendo, para
cada rayo, la distancia que atraviesa cada celda de la matriz y la velocidad
con la que se lee el rayo (calculada en base a dichas distancias y perturbada
al azar para generar ruido).
Este programa est'a compuesto por \texttt{/rayitos/rayitos.cpp}.

\item 
\textbf{cuad\_min}: reconstruye a partir de la tomograf'ia la matriz original 
haciendo cuadrados m'inimos como fue explicado antes.
Este programa est'a compuesto por \texttt{/cuad\_min/cuad\_min.cpp}.

\item 
\textbf{calc\_error}: calcula el error cuadr'atico resultante.
Este programa est'a compuesto por \texttt{/calc\_error/calc\_error.cpp}.

\end{enumerate}

Para facilitar el proceso de ejecuci'on de estos programas y simplificar la 
soluci'on al problema se programaron dos scripts que hacen el trabajo:

\begin{itemize}
\item 
\textbf{comp\_all.sh}: compila todo y genera los binarios.

\item 
\textbf{proc.sh}: corre todos los programas en el orden correcto generando la 
soluci'on.
\end{itemize}

Ahora que ya se explic'o el funcionamiento general de la soluci'on, se ver'an 
algunas cuestiones propias de la soluci'on propuesta.

%COSAS:
%
% 0) Como resolvemos cuadrados minimos
% 1) Como generamos el ruido
% 2) Orden del algoritmo
%
%FIN COSAS.

\subsubsection*{Resoluci'on cuadrados m'inimos}

Para resolver mediante cuadrados m'inimos se resuelve el siguiente sistema

\[ 
D^{t}Dy = D^{t}t
\]

donde D y t son la matriz y el vector, respectivamente, mencionados en el 
enunciado y $D^{t}$ es $D$ transpuesta.

Luego, para resolver este sistema se utiliza el m'etodo de Gauss con pivoteo 
total. Mayor referencia sobre este m'etodo y su implementaci'on puede 
encontrarse en \cite{ChHeRo}.

\subsubsection*{Generaci'on de ruido}

Para la generaci'on de ruido, a cada medici'on se le suma una normal con 
esperanza 0 y varianza igual al par'ametro ingresado por el usuario en el 
programa global.

Para generar una normal existen diversos m'etodos, entre ellos el conocido 
algoritmo de \emph{Box-Muller}. Este algoritmo dice que si se tienen dos 
n'umeros uniformemente distribuidos entre $(0,1]$, entonces dos variables
aleatorias standard normalmente distribuidas son:

\[
c = \sqrt{-2 \ln a} \cos(2\pi b) 
\] 
\[
d = \sqrt{-2 \ln a} \sin(2\pi b)
\] 

Mayor referencia sobre este tema puede encontrarse en \cite{WikiND}.

\subsubsection*{Orden de complejidad}

La complejidad del algoritmo desarrollado es del orden de $O(n^6 + n^2 * m)$.

\subsection{Setting General de la experimentaci'on}
\label{sect:setting}

Para el testeo de la soluci'on desarrollada se desarrollaron distintos tests 
con distintas imagenes y se variaron los par'ametros de entrada del programa.

Se eligieron 3 im'agenes de $25 \times 25$ pixeles. Para cada una de estas 
im'agenes se prob'o con distintos valores para:

\begin{itemize}
\item sigma: nivel del ruido a introducir en la im'agen.
\item m: cantidad de mediciones que se realizan.
\item seed: n'umero que se utiliza como semilla para la generaci'on de rayos.
\end{itemize}

Para sigma se prob'o con cinco valores distintos: 0.1, 0.01, 0.001, 0.0001 y 0.00001.

Para la cantidad de mediciones se utilizaron 4 valores distintos: $n^{2}$, 
$1.5 n^{2}$, $2 n^{2}$ y $3 n^{2}$.

El seed solo vari'o para distintas im'agenes, de esta manera, la ``suerte'' de
cada test dentro del mismo batch es la misma y los resultados estan menos
influenciados por el azar. De cualquier manera, la ley de los grandes n'umeros
asegura que la intervenci'on del azar no altera radicalmente los resultados
de las mediciones en promedio.

Estos tests son presentados y analizados en la pr'oxima secci'on.

A continuaci'on se muestran las 3 im'agenes con las que se desarrollaron los 
tests:

\begin{figure}[!h]
	\centering
	\begin{tabular}{ccc}
	
	\includegraphics[scale=1]{graphics/default/pabloh} &
	\includegraphics[scale=1]{graphics/default/pablor} &
	\includegraphics[scale=1]{graphics/default/toto} \\
	
	\end{tabular}
	\caption{Im'agenes de test: pabloh, pablor y toto, respectivamente.}
	\label{fig:test-01}
\end{figure}	
